package esercitazione4.BTree;

import java.util.ArrayList;
import java.util.Random;
//import java.util.Scanner;

public class MainBTree {
	public static void main(String[] args) throws KeyDuplicateException, NoKeyFoundException {
		//		////////////////////////MAIN SIMPLE	
		//		//numero di figli minimi per nodo
		//		final int DIM_TREE = 2;
		//		Scanner s = new Scanner(System.in);
		//		BTree<Integer, String> tree = new BTree<Integer, String>(DIM_TREE);
		//
		//		tree.add(5, "cinque");
		//		tree.add(2, "quattro");
		//		tree.add(6, "sei");
		//		tree.add(4, "quattro");
		//
		//		// STAMPA ALBERO
		//		System.out.print("DIM_T = " + DIM_TREE);
		//		System.out.println("\tMAX_KEY = " + (DIM_TREE - 1) + "\tMIN_KEY = " + ((DIM_TREE/2)-1));
		//		System.out.println("SIZE: " + tree.size() + "\t\tALTEZZA: " + tree.height());
		//		System.out.println();
		//		System.out.println(tree.toString());
		//
		//		while (tree.size() != 0){
		//			try {
		//				System.out.println("Quale chiave vuoi eliminare?");
		//				int choice = Integer.parseInt(s.nextLine());
		//				tree.delete(choice);
		//
		//				// STAMPA ALBERO
		//				System.out.print("DIM_T = " + DIM_TREE);
		//				System.out.println("\tMAX_KEY = " + (DIM_TREE - 1) + "\tMIN_KEY = " + ((DIM_TREE/2)-1));
		//				System.out.println("SIZE: " + tree.size() + "\t\tALTEZZA: " + tree.height());
		//				System.out.println();
		//				System.out.println(tree.toString());
		//			} catch (NoKeyFoundException e) {
		//				e.printStackTrace();
		//			} catch (TreeEmptyException e) {
		//				e.printStackTrace();
		//			}
		//		}

		//////////////////////////MAIN JUNIT
		//		BTree<Integer, String> btree = new BTree<Integer, String>(3);
		//		
		//		int count = 0;
		//
		//		assertEquals(count, btree.size());
		//
		//		//Inserimenti
		//		btree.add(3, "tre");
		//		// STAMPA ALBERO
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		//System.out.println(btree.toString());
		//		btree.add(5, "cinque");
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.add(2, "due");
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.add(1, "uno");
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.add(7, "sette");
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.add(8, "sette");
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.add(9, "sette");
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.add(10, "sette");
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(2);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(7);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(5);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(3);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(1);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(8);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(9);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());
		//		btree.delete(10);
		//		System.out.print("\nALBERO con DIM: " + btree.size() + " e ALTEZZA: " + btree.height());

		//		//////////////////////////MAIN CYCLE + DEL MANUALE		
		//		// Numero di alberi da generare
		//		final int NUM_CYCLE = 1;
		//		// Dimensione minima di figli per nodo dell'albero
		//		final int DIM_TREE = 2;
		//		// Massimo valore intero da inserire nell'albero (valore minimo = 0)
		//		final int MAX_RANGE_VALUE = 15;
		//		// Numero di nodi inseriti (in maniera sequenziale) nell'albero
		//		final int NUMBER_OF_INSERT = 15;
		//
		//		ArrayList<Integer> array = new ArrayList<Integer>();
		//
		//		//GLI ELEMENTI DELL'ARRAY DEVONO ESSERE DIVERSI FRA LORO, NO DOPPIONI
		//		try {
		//			for(int count = 0; count < NUM_CYCLE; count++){
		//				System.out.println("---------------------IT: " + (count + 1) + "----------------------");
		//				Scanner s = new Scanner(System.in);
		//				BTree<Integer, String> tree = new BTree<Integer, String>(DIM_TREE +  count);
		//				array.clear();
		//
		//				int[] vector = new int[NUMBER_OF_INSERT];
		//				for(int k = 0; k < NUMBER_OF_INSERT; k++){
		//					Random rn = new Random();
		//					int range = MAX_RANGE_VALUE - 0 + 1;
		//					int randomNum =  rn.nextInt(range) + 0;
		//
		//					if(array.contains(randomNum)){
		//						k--;
		//						continue;
		//					}
		//					else
		//						array.add(randomNum);
		//
		//					vector[k] = randomNum;
		//				}
		//
		//				for(int i : vector)
		//					tree.add(i, "Valore (" + i + ")");
		//
		//				// STAMPA ALBERO
		//				System.out.print("DIM_T = " + DIM_TREE);
		//				System.out.println("\tMAX_KEY = " + (DIM_TREE * 2 - 1) + "\tMIN_KEY = " + (DIM_TREE-1));
		//				System.out.println("NUM_NODI: " + tree.size() + "\tALTEZZA: " + tree.height());
		//				System.out.println();
		//				System.out.println(tree.toString());
		//
		//				while (tree.size() != 0){
		//					try {
		//						System.out.println("Quale chiave vuoi eliminare?");
		//						int choice = Integer.parseInt(s.nextLine());
		//						tree.delete(choice);
		//
		//						if(tree.size() != 0){
		//							// STAMPA ALBERO
		//							System.out.print("DIM_T = " + DIM_TREE);
		//							System.out.println("\tMAX_KEY = " + (DIM_TREE * 2 - 1) + "\tMIN_KEY = " + (DIM_TREE-1));
		//							System.out.println("NUM_NODI: " + tree.size() + "\tALTEZZA: " + tree.height());
		//							System.out.println();
		//							System.out.println(tree.toString());
		//						}
		//						else{
		//							System.out.print("DIM_T = " + DIM_TREE);
		//							System.out.println("\tMAX_KEY = " + (DIM_TREE * 2 - 1) + "\tMIN_KEY = " + (DIM_TREE-1));
		//							System.out.println("NUM_NODI: " + tree.size() + "\tALTEZZA: " + tree.height());
		//							System.out.println();
		//							System.out.println("----- Empty -----");
		//							System.out.println();
		//						}
		//					} catch (NoKeyFoundException e) {
		//						e.printStackTrace();
		//					} catch (TreeEmptyException e) {
		//						e.printStackTrace();
		//					}
		//				}
		//
		//				// Press to continue
		//				System.out.println("Premi un tasto per continuare...");
		//				while(!s.hasNextLine());
		//				System.out.println();
		//			}
		//		} catch (KeyDuplicateException e) {
		//			System.out.println("Errore: una delle chiavi inserite è già presente nell'albero.");
		//		}

		//////////////////////////MAIN CYCLE + DEL AUTOMATICA		
		// Numero di alberi da generare
		final int NUM_CYCLE = 10;
		// Dimensione minima di figli per nodo dell'albero
		final int DIM_TREE = 2;
		// Massimo valore intero da inserire nell'albero (valore minimo = 0)
		final int MAX_RANGE_VALUE = 15;
		// Numero di nodi inseriti (in maniera sequenziale) nell'albero
		final int NUMBER_OF_INSERT = 15;

		ArrayList<Integer> array = new ArrayList<Integer>(NUMBER_OF_INSERT);

		//GLI ELEMENTI DELL'ARRAY DEVONO ESSERE DIVERSI FRA LORO, NO DOPPIONI
		try {
			for(int count = 0; count < NUM_CYCLE; count++){
				System.out.println("-----------------------------------IT: " + (count + 1) + "------------------------------------");
				BTree<Integer, String> tree = new BTree<Integer, String>(DIM_TREE);
				array.clear();

				for(int k = 0; k < NUMBER_OF_INSERT; k++){
					Random rn = new Random();
					int range = MAX_RANGE_VALUE - 0 + 1;
					int randomNum =  rn.nextInt(range) + 0;

					if(array.contains(randomNum)){
						k--;
						continue;
					}
					else
						array.add(randomNum);
				}

				for(int i : array)
					tree.add(i, "Valore (" + i + ")");

				// STAMPA ALBERO
				System.out.print("DIM_T = " + DIM_TREE);
				System.out.println("\tMAX_KEY = " + (DIM_TREE * 2 - 1) + "\tMIN_KEY = " + (DIM_TREE-1));
				System.out.println("NUM_NODI: " + tree.size() + "\tALTEZZA: " + tree.height());
				System.out.println();
				System.out.println(tree.toString());

				while (array.size() > 0){
					try {
						//System.out.println("Quale chiave vuoi eliminare?");
						//int choice = Integer.parseInt(s.nextLine());
						Random rn = new Random();
						int range = (array.size() - 1) - 0 + 1;
						int randomNum =  rn.nextInt(range) + 0;
							System.out.println("====> RIMUOVO = " + array.get(randomNum));
							System.out.println();
							tree.delete(array.remove(randomNum));

							if(tree.size() > 0){
								// STAMPA ALBERO
								System.out.print("DIM_T = " + DIM_TREE);
								System.out.println("\tMAX_KEY = " + (DIM_TREE * 2 - 1) + "\tMIN_KEY = " + (DIM_TREE-1));
								System.out.println("NUM_NODI: " + tree.size() + "\tALTEZZA: " + tree.height());
								System.out.println();
								System.out.println(tree.toString());
							}
							else{
								System.out.print("DIM_T = " + DIM_TREE);
								System.out.println("\tMAX_KEY = " + (DIM_TREE * 2 - 1) + "\tMIN_KEY = " + (DIM_TREE-1));
								System.out.println("NUM_NODI: " + tree.size() + "\tALTEZZA: " + tree.height());
								System.out.println();
								System.out.println("----- Empty -----");
								System.out.println();
							}
					} catch (NoKeyFoundException e) {
						e.printStackTrace();
					} catch (TreeEmptyException e) {
						e.printStackTrace();
					}
				}

//				// Press to continue
//				System.out.println("Premi un tasto per continuare...");
//				while(!s.hasNextLine());
				System.out.println();
			}
		} catch (KeyDuplicateException e) {
			System.out.println("Errore: una delle chiavi inserite è già presente nell'albero.");
		}
	}
}
